package com.edev.support.ddd.utils;

import com.edev.support.entity.Entity;
import com.edev.support.subclass.utils.SubClassBuilder;
import com.edev.support.utils.BeanUtils;

import java.io.Serializable;

/**
 * 领域实体构建器（泛型工厂模式）
 * <p>
 * 核心功能：
 * 1. 根据类名或类对象创建实体实例
 * 2. 自动处理实体子类的继承关系
 * 3. 提供静态快捷构建方法
 * <p>
 * 使用示例：
 * <pre>
 * 1. 通过类名构造构建器：
 * EntityBuilder<Customer, Long> builder = new EntityBuilder<>("com.edev.trade.Customer");
 * Customer customer = builder.createEntity();
 * 2. 通过类对象构造构建器：
 * EntityBuilder<Customer, Long> builder = new EntityBuilder<>(Customer.class);
 * Customer customer = builder.createEntity();
 * 3. 静态快捷构建方法：
 * Customer customer = EntityBuilder.build(Customer.class);
 * </pre>
 */
public class EntityBuilder <E extends Entity<S>, S extends Serializable> {
    protected final Class<E> clazz;
    /**
     * 通过类对象构造构建器
     * @param clazz 实体类的Class对象（示例：Customer.class）
     */
    public EntityBuilder(Class<E> clazz) {
        this.clazz = clazz;
    }

    /**
     * 通过类名构造构建器
     * @param className 实体类全限定名（示例："com.edev.trade.Customer"）
     */
    public EntityBuilder(String className) {
        this.clazz = EntityUtils.getClassOfEntity(className);
    }

    /**
     * 创建实体实例（自动处理子类）
     * <p>
     * 处理逻辑：
     * 1. 检查是否为子类实体
     * 2. 是子类：调用子类构建器
     * 3. 普通类：通过反射实例化
     * <p>
     * 使用示例：
     * EntityBuilder<Customer, Long> builder = new EntityBuilder<>(Customer.class);
     * Customer customer = builder.createEntity();
     * @return 初始化后的实体对象
     */
    public E createEntity() {
        if(EntityUtils.isSubClass(clazz))
            return SubClassBuilder.build(clazz);
        return BeanUtils.createBean(clazz);
    }

    /**
     * 静态快捷构建方法
     * <p>
     * 使用示例：
     * Customer customer = EntityBuilder.build(Customer.class);
     * @param clazz 实体类的Class对象
     * @return 初始化后的实体实例
     */
    public static <E extends Entity<S>, S extends Serializable> E build(Class<E> clazz) {
        return (new EntityBuilder<E, S>(clazz)).createEntity();
    }
}
